﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Diego_Data
{
	public class DataUtil
	{
		public List<DateTime> gerarListaComDiasUteis( DateTime data )
		{
			List<DateTime> listaDeDiasUteis = recuperarDatas( data );

			listaDeDiasUteis = retirarFeriadosEFinaisDeSemana( listaDeDiasUteis );

			listaDeDiasUteis = completarListaComDiasUteis( listaDeDiasUteis );

			return listaDeDiasUteis;
		}

		public List<DateTime> recuperarDatas( DateTime dateTime )
		{
			List<DateTime> listaDeDatas = new List<DateTime>();
			int quantidadeDeDias = 5;

			for( int i = 1; i < quantidadeDeDias + 1; i++ )
			{
				listaDeDatas.Add( dateTime.AddDays( -i ) );
			}

			return listaDeDatas;
		}

		public List<DateTime> retirarFeriadosEFinaisDeSemana( List<DateTime> listaDeDatas )
		{
			List<DateTime> listaDeDatasSemferiadosSemFinaisDeSemana = new List<DateTime>();

			foreach( DateTime item in listaDeDatas )
			{
				if( verificarSeEFinalDeSemanaOuFeriado( item ) )
				{
					listaDeDatasSemferiadosSemFinaisDeSemana.Add( item );
				}
			}
			return listaDeDatasSemferiadosSemFinaisDeSemana;
		}

		public List<DateTime> completarListaComDiasUteis( List<DateTime> listaDeDiasUteis )
		{
			int dias = 1;
			int quantidadeDeItens = listaDeDiasUteis.Count;
			int quantidadeDeItensQueDeveriaEstarNaLista = 5;
			int quantidadeDeItensQueDeveSerAdicionado = quantidadeDeItensQueDeveriaEstarNaLista - quantidadeDeItens;
			int posicaoDaUltimaDataNaLista = listaDeDiasUteis.Count - 1;
			DateTime ultimaDataUtil = listaDeDiasUteis[ posicaoDaUltimaDataNaLista ];

			for( int i = 1; i < quantidadeDeItensQueDeveSerAdicionado + 1; )
			{
				if( verificarSeEFinalDeSemanaOuFeriado( ultimaDataUtil.AddDays( -dias ) ) )
				{
					listaDeDiasUteis.Add( ultimaDataUtil.AddDays( -dias ) );
					i++;
				}
				dias++;
			}

			return listaDeDiasUteis;
		}

		private bool verificarSeEFinalDeSemanaOuFeriado( DateTime item )
		{
			List<DateTime> listaDeFeriados = recuperarListaDeFeriados();

			//Verifica se é um feriado
			if( listaDeFeriados.Contains( item ) )
			{
				return false;
			}
			else
			{
				if( item.DayOfWeek == DayOfWeek.Sunday || item.DayOfWeek == DayOfWeek.Saturday )
				{
					return false;
				}
				else
				{
					return true;
				}
			}
		}

		private List<DateTime> recuperarListaDeFeriados()
		{
			List<DateTime> listaDeFeriados = new List<DateTime>();
			listaDeFeriados.Add( new DateTime( 2012, 02, 21 ) );
			return listaDeFeriados;
		}
	}
}
